#include <iostream>
#include <unistd.h>
#include <signal.h>

// 打印block表
void PrintfBlock()
{
    sigset_t set, oset;
    sigemptyset(&set);
    sigemptyset(&oset);

    sigprocmask(SIG_BLOCK, &set, &oset);
    std::cout << "block:";
    for (int signo = 31; signo > 0; signo--)
    {
        if (sigismember(&oset, signo))
        {
            std::cout << 1;
        }
        else
        {
            std::cout << 0;
        }
    }
    std::cout << std::endl;
}

// 打印pinding表
void PrintfPending()
{
    sigset_t pending;
    // 获取
    ::sigpending(&pending);

    std::cout << "Pending:";
    for (int signo = 31; signo > 0; signo--)
    { 
        if (sigismember(&pending, signo))
        {
            std::cout << 1;
        }
        else
        {
            std::cout << 0;
        }
    }
    std::cout << std::endl;
}

void handler(int signo)
{
    static int cnt = 0;
    cnt++;
    while (true)
    {
        std::cout << "get a sig : " << signo << ",cnt: " << cnt << std::endl;
        PrintfBlock();
        sleep(1);
        break;
    }
    //exit(1);
}

int main()
{
    struct sigaction act, oact;
    act.sa_handler = handler;

    sigemptyset(&act.sa_mask);
    for(int n=1;n<=31;n++)
    {
        sigaddset(&act.sa_mask,n);
    }
    // sigaddset(&act.sa_mask,3);
    // sigaddset(&act.sa_mask,4);
    // sigaddset(&act.sa_mask,5);
    // sigaddset(&act.sa_mask,6);
    // sigaddset(&act.sa_mask,7);

    ::sigaction(2, &act, &oact);

    while (true)
    {
        PrintfBlock();
        pause();
    }
}

// #include <iostream>
// #include <string>
// #include <vector>
// #include <functional>
// #include <unistd.h>
// #include <signal.h>
// #include <stdlib.h>
// #include <sys/wait.h>

// void PrintfPending(const sigset_t &pending)
// {
//     std::cout << "curr pending list [" << getpid() << "]: ";
//     for (int signo = 31; signo > 0; signo--)
//     {
//         // 查询pending是或否有
//         if (sigismember(&pending, signo))
//         {
//             std::cout << 1;
//         }
//         else
//         {
//             std::cout << 0;
//         }
//     }
//     std::cout << std::endl;
// }

// void non_handler(int signo)
// {
//     std::cout << "处理：" << signo << std::endl;
// }

// int main()
// {
//     //::signal(2,SIG_IGN);
//     ::signal(2, non_handler);

//     // 1.对2号信号屏蔽
//     sigset_t block, oblock;
//     // 战上开辟的空间，因此需要清零
//     sigemptyset(&block);
//     sigemptyset(&oblock);
//     // 1.1 添加2号信号
//     // 我们只是在用户栈上设置了block的位图结构
//     // 并没有设置进入内核中
//     sigaddset(&block, 2);
//     // 1.2 设置进入内核中
//     sigprocmask(SIG_SETMASK, &block, &oblock);

//     int cnt = 0;

//     while (true)
//     {
//         // 2. 获取pending表
//         sigset_t pending;
//         sigpending(&pending);

//         // 2.1 打印
//         PrintfPending(pending);

//         sleep(1);

//         cnt++;

//         if(cnt == 10)
//         {
//             std::cout<<"解除对2号信号的屏蔽"<<std::endl;
//             sigprocmask(SIG_SETMASK,&oblock,nullptr);
//         }
//     }
//     return 0;
// }
